package huffman;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

/**
 * @author 谭继好
 * @Description
 * @date 2024-05-18 17:53
 */
public class MultiThreadZip {

    // 调参：
    private static final int MAX_SIZE = 1000000;

    public void zip(String path) {

        // 按容量划分线程，结果存储到哈希表中，拼串后写入文件
        // 也可以将StringBuilder结果写入哈希表，为了跟线程池统一，将Future写入哈希表
        Long filelength = new File(path).length();
        int len = (int) (filelength / MAX_SIZE);
        Map<Integer, Future> map = new HashMap<>(len + 1);

        // 多线程读取文件建树
        for (int i = 0; i < len + 1; i++) {
            FutureTask<StringBuilder> task = new FutureTask<>(new Utils.ZipThread(path, (int) Math.min(MAX_SIZE, filelength)));
            filelength -= MAX_SIZE;
            Thread thread = new Thread(task);
            thread.start();
            map.put(i, task);
        }

        // 写出到文件
        Utils.writeToFile(path.replace(".txt", "-zip.txt"), map);
    }

    public void unzip(String path) {

        // 读取文件全部内容，以"竺"分隔
        String content = Utils.readAllFile(path);
        String[] split = content.split("竺");

        // 注意：最后的"竺"并不会多出来一个空串，所以长度恰好是个数
        Map<Integer, Future> map = new HashMap<>(split.length);

        // 多线程解码
        for (int i = 0; i < split.length; i++) {
            FutureTask<StringBuilder> task = new FutureTask<>(new Utils.UnZipThread(split[i]));
            Thread thread = new Thread(task);
            thread.start();
            map.put(i, task);
        }

        // 拼串，写出到文件
        Utils.writeToFile(path.replace("-zip.txt", "-recover.txt"), map);
    }

}